home *** CD-ROM | disk | FTP | other *** search
/ Amiga Inside! / Amiga FD Inside (1995)(Ultramax).iso / forumamiga / ausgabe15 / texte / c-antworten < prev    next >
Text File  |  1993-08-16  |  11KB  |  325 lines

  1. C-Antworten für Daniel Naber
  2. ----------------------------
  3.  
  4. »1. Ich versuche im Moment ein kleines Malprogramm in C zu programmieren. Um
  5. »mit Brushes zu arbeiten und für die Undo-Funktion benutze ich den Befehl
  6. »BltBitMap. Ich dachte mir um den aktuellen Brush irgendwo unterzubringen
  7. »öffne ich einfach ein zweites Window hinter dem Zeichen-Window. Dummerweise
  8. »kopiert der oben genannte Befehl (wie man an seinem Namen schon hört) nicht
  9. »einfach den Inhalt eines Fensters sondern die BitMap eines ganzen Screens
  10. »(auch wenn man als Argument die Bitmap eines Fensters übergibt, z.B.
  11. »mywindow->RPort->BitMap) !! Das Problem war also das eine Kopie die für
  12. »das im Hintergrund liegende Brush-Window bestimmt war auch auf dem Zeichen-
  13. »window sichtbar wurde.
  14.  
  15. »Wie kann ich nun eine BitMap einrichten die man ganz normal mit BltBitMap
  16. »benutzen kann, die aber nicht sichtbar ist? Oder gibt es noch eine andere
  17. »Lösung? Zur Not könnte ich natürlich einen zweiten Screen für die Brushes
  18. »öffnen, und einen dritten für die Undo-Funktion, und...
  19.  
  20. Eine unsichtbare BitMap wird so errichtet:
  21.  
  22. ...
  23.   
  24.   struct BitMap my_bitmap;
  25.   struct RastPort my_rastport;
  26.  
  27.   InitBitMap(&my_bitmap,DEPTH,WIDTH,HEIGHT);
  28.   for(loop=0;loop<DEPTH;loop++)
  29.   {
  30.     my_bitmap.Planes[loop]=(PLANEPTR)AllocRaster(WIDTH,HEIGHT);
  31.     if(my_bitmap.Planes[loop]==NULL)
  32.       {
  33.         for(loop2=0;loop2<loop;loop2++)
  34.           FreeRaster(my_bitmap.Planes[loop],WIDTH,HEIGHT);
  35.         /* hier noch Fehlermeldung ausgeben und Programm beenden */
  36.       }
  37.   }
  38.   InitRastPort(&my_rastport);
  39.   my_rastport.BitMap=&my_bitmap;
  40. ...
  41. Wie Du siehtst, ist es nicht mal ein Problem, ihr noch einen RastPort mit
  42. auf den Weg zu geben.
  43.  
  44.  
  45. Freigegeben wird alles wieder so:
  46.  
  47. ...
  48.   for(loop=0;loop<DEPTH;loop++)
  49.     if(my_bitmap.Planes[loop])
  50.       FreeRaster(my_bitmap.Planes[loop],WIDTH,HEIGHT);
  51. ...
  52.  
  53.  
  54. Wenn Dir das bei Deinem Problem aber immer noch nicht weiterhilft, versuch
  55. es mal mit der layers.library. Ich habe sie zwar noch nie benutzt, aber es
  56. muß darin wohl einige Routinen für das Handling von Fensterinhalten geben.
  57.  
  58.  
  59.  
  60. »2. Wie kann man ein Window öffnen, das wie ein original Workbench-Window
  61. »aussieht (mit den Scroller-Gadgets im Rahmen etc.) ?
  62.  
  63. Das erfordert etwas Aufwand:
  64.  
  65.  
  66. struct Window *win;
  67. struct Image *pfeil1, *pfeil2, *pfeil3, *pfeil4;
  68. struct Gadget *butgad1, *butgad2, *butgad3, *butgad4, *propgad1, *propgad2;
  69. struct DrawInfo *drawinfo;
  70.  
  71. BOOL OpenTheWindow()
  72.   {  
  73.   struct Screen *wbscreen;
  74.         
  75.   if(wbscreen=LockPubScreen("Workbench"))
  76.    {
  77.     if(drawinfo=GetScreenDrawInfo(wbscreen))
  78.      {
  79.       if(pfeil1=NewObject (NIL, "sysiclass", SYSIA_Size, SYSISIZE_MEDRES,
  80.                                              SYSIA_Which, UPIMAGE,
  81.                                              SYSIA_DrawInfo, drawinfo,
  82.                                              TAG_END))
  83.        {
  84.         if(pfeil2=NewObject (NIL, "sysiclass", SYSIA_Size, SYSISIZE_MEDRES,
  85.                                                SYSIA_Which, DOWNIMAGE,
  86.                                                SYSIA_DrawInfo, drawinfo,
  87.                                                TAG_END))
  88.          {
  89.           if(pfeil3=NewObject (NIL, "sysiclass", SYSIA_Size, SYSISIZE_MEDRES,
  90.                                                  SYSIA_Which, LEFTIMAGE,
  91.                                                  SYSIA_DrawInfo, drawinfo,
  92.                                                  TAG_END))
  93.            {
  94.             if(pfeil4=NewObject (NIL, "sysiclass", SYSIA_Size, SYSISIZE_MEDRES,
  95.                                                    SYSIA_Which, RIGHTIMAGE,
  96.                                                    SYSIA_DrawInfo, drawinfo,
  97.                                                    TAG_END))
  98.              {
  99.  
  100.   if(butgad1=NewObjectA(NIL, 'buttongclass', GA_Image, pfeil1,
  101.                           GA_RelRight, -pfeil1->Width+1,
  102.                           GA_RelBottom, -9 - pfeil2->Height - pfeil1->Height,
  103.                           GA_ID, 1,
  104.                           GA_Immediate, Ord (TRUE),
  105.                           GA_RelVerify, Ord (TRUE),
  106.                           TAG_END))
  107.    {
  108.     if(butgad2=NewObjectA(NIL, 'buttongclass', GA_Image, pfeil2,
  109.                                            GA_RelRight, -pfeil2->Width+1,
  110.                                            GA_RelBottom, -9 - pfeil2->Height,
  111.                                            GA_ID, 2,
  112.                                            GA_Immediate, Ord (TRUE),
  113.                                            GA_RelVerify, Ord (TRUE),
  114.                                            GA_Previous, butgad1,
  115.                                            TAG_END))
  116.      {
  117.       if(butgad3=NewObjectA(NIL, 'buttongclass', GA_Image, pfeil3,
  118.                                  GA_RelRight, 17-pfeil4->Width-pfeil3->Width,
  119.                                  GA_RelBottom, -pfeil3->Height+1,
  120.                                  GA_ID, 3,
  121.                                  GA_Immediate, Ord (TRUE),
  122.                                  GA_RelVerify, Ord (TRUE),
  123.                                  GA_Previous, butgad2,
  124.                                  TAG_END))
  125.        {
  126.         if(butgad4=NewObjectA(NIL, 'buttongclass', GA_Image, pfeil4,
  127.                                              GA_RelRight, 17-pfeil4->Width,
  128.                                              GA_RelBottom, -pfeil4->Height+1,
  129.                                              GA_ID, 4,
  130.                                              GA_Immediate, Ord (TRUE),
  131.                                              GA_RelVerify, Ord (TRUE),
  132.                                              GA_Previous, butgad3,
  133.                                              TAG_END))
  134.          {
  135.  
  136.   if(propgad1=NewObjectA(NIL, "propgclass", GA_RelRight, -pfeil1->Width+5,
  137.                  GA_Top, wbscreen->WBorTop + wbscreen->Font->ta_YSize +2,
  138.                  GA_Width, pfeil1->Width-8,
  139.                  GA_RelHeight, -wbscreen->WBorTop-wbscreen->Font->ta_YSize
  140.                                -14-pfeil1->Height-pfeil2->Height,
  141.                  GA_ID, 11,
  142.                  GA_Immediate, TRUE,
  143.                  GA_RelVerify, TRUE,
  144.                  GA_FollowMouse, TRUE,
  145.                  GA_Previous, butgad4,
  146.                  PGA_Freedom, FREEVERT,
  147.                  PGA_Total, 100,
  148.                  PGA_Visible, 75,
  149.                  PGA_Top, 10,
  150.                  PGA_NewLook, TRUE,
  151.                  TAG_END))
  152.    {
  153.     if(propgad2=NewObjectA(NIL, "propgclass", GA_Left, wbscreen->WBorLeft,
  154.                       GA_RelBottom, -pfeil3->Height+3,
  155.                       GA_RelWidth, -wbscreen->WBorLeft-22-pfeil3->Width
  156.                                    -pfeil4->Width,
  157.                       GA_Height, pfeil3->Height-4,
  158.                       GA_ID, 12,
  159.                       GA_Immediate, TRUE,
  160.                       GA_RelVerify, TRUE,
  161.                       GA_FollowMouse, TRUE,
  162.                       GA_Previous, propgad1,
  163.                       PGA_Freedom, FREEHORIZ,
  164.                       PGA_Total, 100,
  165.                       PGA_Visible, 95,
  166.                       PGA_NewLook, TRUE,
  167.                       TAG_END))
  168.      {
  169.       if(win=OpenWindowTags(NIL, WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET |
  170.                                         WFLG_CLOSEGADGET | WFLG_SIZEGADGET |
  171.                                         WFLG_ACTIVATE | WFLG_SIZEBRIGHT |
  172.                                         WFLG_SIZEBBOTTOM | WFLG_SMART_REFRESH,
  173.                                  WA_IDCMP, IDCMP_CLOSEWINDOW,
  174.                                  WA_Gadgets, butgad1,
  175.                                  WA_MinHeight, 50,
  176.                                  WA_MinWidth, 100,
  177.                                  TAG_END))
  178.       UnlockPubScreen('Workbench', wbscreen);
  179.       return(TRUE);
  180.      }
  181.     }
  182.     
  183.     }
  184.     }   /* hier müssen jede Menge else-Zweige stehen, damit alles  */
  185.     }   /* wieder freigegeben wird, auch wenn mal ein Gadget nicht */
  186.     }   /* erzeugt werden kann                                     */
  187.               
  188.              }
  189.            }
  190.          }
  191.        }
  192.      }
  193.     UnlockPubScreen('Workbench', wbscreen);
  194.     return(FALSE);
  195.    }
  196.   }
  197.  
  198. Freigegeben wird alles wieder so:
  199.  
  200. VOID CloseTheWindow()
  201.   {
  202.    struct Screen *wbscreen;
  203.    
  204.    CloseWindow(win);
  205.    DisposeObject(propgad2);
  206.    DisposeObject(propgad1);
  207.    DisposeObject(butgad4);
  208.    DisposeObject(butgad3);
  209.    DisposeObject(butgad2);
  210.    DisposeObject(butgad1);
  211.    DisposeObject(pfeil4);
  212.    DisposeObject(pfeil3);
  213.    DisposeObject(pfeil2);
  214.    DisposeObject(pfeil1);
  215.    if(wbscreen=LockPubScreen("Workbench"))
  216.     {
  217.      FreeScreenDrawInfo(wbscreen,drawinfo);
  218.      UnlockPubScreen("Workbench",wbscreen);
  219.     }
  220.    }
  221.    
  222. Ich kann nur den BOOPSI-Kurs aus dem Amiga-Magazin ab 5/93 empfehlen.
  223.  
  224.  
  225.  
  226. »3. Wie kann man ein ganz normales Button-Gadget unter OS2.0++ dauerhaft
  227. »in den aktivierten Zustand schalten (Das es so aussieht, als würden man die
  228. »linke Maustaste darüber gedrückt halten.) ?
  229.  
  230. Man setzt das SELECTED-Flag in der Gadget-Struktur und zeichnet es dann neu:
  231.  
  232. DrueckeGadget(struct Gadget *g, struct Window *w)
  233.   {
  234.     g->Flags|= SELECTED;
  235.     RefreshGList(g, w, NULL, 1);
  236.   }
  237.  
  238. solange, bis man es das Flag wieder löscht, um das Gadget wieder normal zu
  239. zeichnen:
  240.  
  241. LasseGadgetLos(struct Gadget *g, struct Window *w)
  242.   {
  243.     g->Flags&= ~SELECTED;
  244.     RefreshGList(g, w, NULL, 1);
  245.   }
  246.  
  247.  
  248.  
  249. »4. Wie kann man möglichst einfach abfragen ob die Shift-Taste gedrückt
  250. »ist (Über IntuiMessage->Class, Code oder Qualifier) ?
  251.  
  252. ...
  253.   BOOL lshift_gedrueckt=FALSE,rshift_gedrueckt=FALSE,shift_gedrueckt=FALSE;
  254.   
  255.   while(was_weiss_ich)
  256.     {
  257.       WaitPort(window->UserPort)
  258.       if(im=GetMsg(window->UserPort))
  259.         {
  260.           if(im->Class==IDCMP_RAWKEY)
  261.             {
  262.               if(im->Code<IECODE_UP_PREFIX)
  263.                 {
  264.                   if(im->Qualifier & (IEQUALIFIER_LSHIFT)
  265.                     lshift_gedrueckt=TRUE;
  266.                   if(im->Qualifier & (IEQUALIFIER_RSHIFT)
  267.                     rshift_gedrueckt=TRUE;
  268.                 }
  269.               else
  270.                 {
  271.                   if(im->Qualifier & (IEQUALIFIER_LSHIFT)
  272.                     lshift_gedrueckt=FALSE;
  273.                   if(im->Qualifier & (IEQUALIFIER_RSHIFT)
  274.                     rshift_gedrueckt=FALSE;
  275.                 }
  276.             }
  277.           ReplyMsg(im)
  278.         }
  279.       shift_gedrueckt=rshift_gedrueckt || lshift_gedrueckt;
  280.       if(shift_gedrueckt)
  281.         {
  282.           ...
  283.         }
  284.       else
  285.         {
  286.           ...
  287.         }
  288.       }
  289. ...
  290. Intuition schickt nämlich auch dann eine RAWKEY-Message, wenn die SHIFT-Taste
  291. alleine gedrückt wird.
  292.  
  293.  
  294.  
  295. »5. Wie kann man den Inhalt eines String-Gadgets abfragen? (Bei Programmen
  296. »die man mit GadToolsBox entwickelt hat)
  297.  
  298. STRPTR GetTextFromStringGadget(struct Gadget *g)
  299.   {
  300.     struct StringInfo *si
  301.     si=g->SpecialInfo
  302.     return(si->Buffer)
  303.   }
  304.  
  305.  
  306.  
  307. »6. Zu Amiga-Dos: Wie kann man eine lange Zeile mit vielen Parametern in
  308. »Script-Files auf mehrere Zeilen verteilen?
  309.  
  310. ??? Das wüßte ich auch zu gerne.
  311.  
  312.  
  313.  
  314.  
  315. Ich muß noch einmal betonen: Eigentlich beherrsche ich C so gut wie gar nicht,
  316. also bitte nicht ärgern, wenn irgendetwas nicht stimmt. Die Sache mit dem
  317. Workbench-Window habe ich mit KickPascal ausprobiert, das vom Programm akti-
  318. vierte Gadget und das Besorgen des Stringgadgetinhaltes (OK, ich arbeite nicht
  319. mit GadToolsBox) benutze ich regelmäßig in meinen Pascalprogrammen.
  320. Aber ich habe vor, C mit allen Schikanen zu lernen. Einen Compiler habe ich
  321. schon, fehlt nur noch etwas Zeit...
  322.  
  323. Roland Fulde
  324.  
  325.